<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 基本数据类型又叫简单数据类型
      // number string Boolean null undefined symble
      // 简单数据类型存在栈里

      // 复杂数据类型又叫引用数据类型
      // object array data function regexp
      // 复杂数据类型存在堆里 但是在栈里有一个地址指向真正的堆内存

      //   深复制浅复制
      // 深复制复制的是真正的值  简单数据类型都是深复制
      // 浅复制复制的是地址  复杂数据类型普通的复制都是浅复制

      //   let num1 = 10;
      //   let num2 = num1;
      //   num2 = 20;
      //   console.log(num1, num2);

      //   let arr = [1, 2, 3];
      //   let arr2 = arr;
      //   arr2[0] = 10;
      //   console.log(arr, arr2);
      //数组是一个引用数据类型 普通的复制只能实现浅拷贝

      //   如何实现数组的深拷贝
      let arr = [1, 2, 3];
      let arr2 = arr.concat(); //使用concat合并数组，会返回一个新的数组
      arr2[0] = 10;
      console.log(arr, arr2);

      //   let obj = { name: "小鱼鱼" };
      //   let obj2 = obj;
      //   obj2.name = "小黄黄";
      //   console.log(obj, obj2);
      //   对象是一个引用数据类型 普通的复制是一个浅拷贝

      //对象的深拷贝
      //   let obj = { name: "小鱼鱼" };
      //   let obj2 = JSON.parse(JSON.stringify(obj));
      //   obj2.name = "小红花";
      //   console.log(obj, obj2);

      let obj = {
        name: "小黄",
        item: { phone: 133333333, sex: "nv", age: 33 },
      };
      //   对象深拷贝的第二种方法
      //   递归 自身调用自身

      function deepCopy(obj) {
        let obj2 = {};
        if (obj instanceof Object) {
          for (let key in obj) {
            if (obj[key] instanceof Object) {
              obj2[key] = deepCopy(obj[key]);
            } else {
              obj2[key] = obj[key];
            }
          }
        }
        return obj2;
      }
      //当去复制一个复杂的对象的时候，如果这个对象的key是一个简单类型，就直接复制，如果还是一个引用类型就调用自身再次进行循环复制

      let result = deepCopy(obj);
      console.log(result, obj);
      result.item.age = 18;
    </script>
  </body>
</html>
